import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:练习
 * User: dings
 * Date: 2024-05-07
 * Time: 8:26
 */
public class Test {
    /**
     *给你一个整数数组 arr，请你判断数组中是否存在连续三个元素都是奇数的情况：
     * 如果存在，请返回 true ；否则，返回 false 。
     */
    public static boolean judgeElement(int[] arr) {
        boolean flg = false;
        for (int i = 0; i < arr.length; i++) {
            if (i+1 < arr.length && i + 2 < arr.length
                    && arr[i] % 2 != 0 && arr[i+1] % 2 != 0
                    && arr[i+2] != 0) {
                flg = true;
            }
        }
        return flg;
    }
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,7};
        boolean flg = judgeElement(arr);
        System.out.println(flg);
    }
    /**
     * 给定一个大小为 n 的数组，找到其中的多数元素。
     * 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
     * 你可以假设数组是非空的，并且给定的数组总是存在多数元素。
     */
    public static void findMostElement(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int count = 0;
            for (int j = 0; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    count++;
                }
            }
            if((arr.length >>> 1) < count) {
                System.out.println(arr[i]);
                return;
            }
        }
    }
    public static void main7(String[] args) {
        int[] arr = {2,2,2,2,2,7,7,4,6,4,4,4,4,4,4,4,4,4,4,4,4};
        findMostElement(arr);
    }
    /**
     * 给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现两次。
     * 找出那个只出现了一次的元素
     */
    public static void findElement(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            boolean flg = false;
            for (int j = 0; j < arr.length; j++) {
                if(i == j && j != arr.length - 1) {
                    j += 1;
                }
                if(arr[i] == arr[j] && i != j) {
                    flg = true;
                }
            }
            if(flg == false) {
                System.out.println(arr[i]);
            }
        }
    }
    public static void main6(String[] args) {
        int[] arr = new int[]{4,4,5,34,9,3,5,3,34};
        findElement(arr);
    }
    /**
     * 给定一个整数数组 nums 和一个整数目标值 target，
     * 请你在该数组中找出和为目标值 target 的那两个整数，并返回它们的数组下标。
     *输入：nums = [2,7,11,15], target = 9
     *输出：[0,1]
     *解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1]
     */
    public static void findTwoIndex(int[] arr,int target) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if(arr[i] + arr[j] == target) {
                    System.out.println("["+i+","+j+"]");
                }
            }
        }
    }
    public static void main5(String[] args) {
        int[] arr = new int[]{3,6,7,9,5,1};
        int target = 15;
        findTwoIndex(arr,target);
    }
    /**
     * 冒泡排序
     */
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flg = false;
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j] > arr[j+1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    flg = true;
                }
            }
            if(flg == false) {
                break;
        }
    }
}
    public static void main4(String[] args) {
        int[] arr1 = {12,23,45,65,3,2,2,4,55,345,46,27,16,44,34,3,5};
        int[] arr2 = {12,23,45,65,3,2,2,4,55,345,46,27,16,44,34,3,5};
        Arrays.sort(arr2);
        System.out.println("systemSort:"+Arrays.toString(arr2));
        bubbleSort(arr1);
        System.out.println("mySort:    "+Arrays.toString(arr1));
    }
    /**
     * 给定一个有序整型数组, 实现二分查找
     */
    public static int myBinarySearch(int[] arr,int key) {
        int left = 0;
        int right = arr.length - 1;
        int mid = (left + right) >>> 1;
        while (left <= right) {
            if(arr[mid] > key) {
                right = mid - 1;
                mid = (left + right) >>> 1;
            } else if (arr[mid] < key) {
                left = mid + 1;
                mid = (left + right) >>> 1;
            }else {
                return mid;
            }
        }
        return -1;
    }
    public static void main3(String[] args) {
        int[] arr = new int[]{34,65,6,3,23,2,46,5,7,6,87};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        int index1 = Arrays.binarySearch(arr,46);
        System.out.println(index1);
        int index2 = myBinarySearch(arr,46);
        System.out.println(index2);
    }
    /**
     * 调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序。
     *
     * 如数组：[1,2,3,4,5,6]
     *
     * 调整后可能是：[1, 5, 3, 4, 2, 6]
     * @param args
     */
    public static void changPos(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            while (arr[left] % 2 != 0 && left < right) {
                left++;
            }
            while (arr[right] % 2 == 0 && left < right) {
                right--;
            }
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
        }
    }
    public static void main2(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8};
        System.out.println("before:"+ Arrays.toString(arr));
        changPos(arr);
        System.out.println("after:"+Arrays.toString(arr));
    }
    /**
     * 实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 ,
     * 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}
     * @param arr
     */
    public static void transform(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 2;
        }
    }
    public static void main1(String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6};
        System.out.println("before:"+ Arrays.toString(arr));
        transform(arr);
        System.out.println("after:"+Arrays.toString(arr));
    }
}
